import myAxios from '../myAxios/myAxios.js';
import myAxios28 from '../myAxios/myAxios28.js';

import myArr from '../myAxios/myArr.js';
let { GetNumber } = myArr;

let GetAvgMonth = async function (matnrs) {
	// 假设已存在以下全局或导入的依赖项：
	// - GetSapFHL (用于获取SAP数据的函数，返回Promise，解析为对象数组)
	// - MATNR, DIFFERENCE_BETWEEN_REQUIRE_MONTH (字符串常量，列名)

	// 1. 初始化结果对象，用于存储每个物料的平均月份差异总和
	let avgMonthDic = {}; // 结构: { "MATNR1": sum1, "MATNR2": sum2, ... }

	// 2. 调用GetSapFHL函数获取数据 (假设它返回一个Promise，解析为对象数组)
	let dt;
	try {
		dt = await GetSapFHL(matnrs, 3); // 假设第二个参数3表示月份范围或其他条件
	} catch (error) {
		console.error("调用GetSapFHL函数获取数据失败:", error);
		throw error; // 或返回空对象 {}
	}

	// 3. 检查返回的数据是否有效
	if (!dt || !Array.isArray(dt)) {
		console.warn("GetSapFHL返回的数据无效或不是数组");
		return avgMonthDic;
	}

	// 4. 遍历数据行，按物料号汇总DIFFERENCE_BETWEEN_REQUIRE_MONTH
	for (const row of dt) {
		const nextMatnr = row['MATNR']; // 物料号
		// 获取DIFFERENCE_BETWEEN_REQUIRE_MONTH的值，转换为整数，失败则为0
		const avgMonth = GetNumber(row['DIFFERENCE_BETWEEN_REQUIRE_MONTH']) || 0;

		// 在avgMonthDic中查找是否已存在该物料号
		if (avgMonthDic.hasOwnProperty(nextMatnr)) {
			avgMonthDic[nextMatnr] += avgMonth; // 如果存在，则累加
		} else {
			avgMonthDic[nextMatnr] = avgMonth; // 如果不存在，则添加新键值对
		}
	}

	// 5. (原C#中注释掉的逻辑：处理另一数据源dt1。如果需要，请取消注释并实现)
	// ...

	// 6. 把结果变回数组并返回
	let dt1 = Object.entries(avgMonthDic).map(([matnr, sum]) => ({ MATNR: matnr, AVG_MONTH: sum }));
	console.log('GetAvgMonth :>> ', dt1);
	return dt1;
};

let kwList = ["3001", "3002", "3003", "3006", "9101",];
let GetSapFHL = async function (metCodeParamString, month = 1) {
	// 假设已存在以下全局或导入的依赖项：
	// - GetSapGZ (用于获取SAP过账记录的函数，返回Promise，解析为对象数组)
	// - kwList (关键字列表，例如 ['601', '643', '653']，但原C#代码中循环只执行了一次且使用了硬编码的kwList[i])

	// 1. 计算日期范围
	const now = new Date();
	const startDate = new Date(now);
	startDate.setMonth(now.getMonth() - month);
	const startDateString = dayjs(startDate).format('YYYYMMDD');
	const endDateString = dayjs(now).format('YYYYMMDD');

	// 2. 初始化合并表
	let gzTable = null; // 将存储合并后的数据（对象数组）

	// 3. 获取并合并数据 (原C#代码中循环只执行一次，使用了kwList[0])
	// 假设 kwList 是预定义的，例如 const kwList = ['601', '643', '653'];
	// 但原C#代码中注释掉了643和653的调用，只使用了601（通过循环一次实现）
	for (let i = 0; i < 1; i++) { // 注意：循环只执行一次
		const kw = kwList[i]; // 例如 '601'
		let t1;
		try {
			t1 = await GetSapGZ(metCodeParamString, startDateString, endDateString, kw);
		} catch (error) {
			console.error(`调用GetSapGZ失败 (kw: ${kw}):`, error);
			continue; // 跳过此次循环，继续下一次
		}

		if (!gzTable) {
			gzTable = t1; // 第一次获取数据，直接赋值
		} else {
			// 合并数据: 简单地将两个数组合并
			gzTable = [...gzTable, ...t1];
		}
	}

	// 4. 检查获取的数据是否有效
	if (!gzTable || !Array.isArray(gzTable) || gzTable.length === 0) {
		console.warn("未获取到有效的SAP过账记录数据");
		return [];
	}

	// 5. 按物料号(MATNR)分组，并计算每个组的MENGE总和
	const groupedMap = {}; // 使用对象进行分组聚合

	for (const row of gzTable) {
		const matnr = row.MATNR; // 物料号
		const menge = parseFloat(row.MENGE) || 0; // 数量

		if (!groupedMap[matnr]) {
			groupedMap[matnr] = {
				MATNR: matnr,
				DIFFERENCE_BETWEEN_REQUIRE_MONTH: 0
			};
		}
		groupedMap[matnr].DIFFERENCE_BETWEEN_REQUIRE_MONTH += menge;
	}

	// 6. 将分组对象转换为数组
	let dtGroupBy = Object.values(groupedMap);

	// 7. 返回最终结果
	console.log(`GetSapFHL ${month} :>> `, dtGroupBy);
	return dtGroupBy;
};
let sapMoveCodeList = ["261", "262", "601", "643", "644", "653", "S61", "S62",];
let GetSapGZ = async function (metCodeParamString, startDate, endDate, kw) {
	// 假设已存在以下全局或导入的依赖项：
	// - client.GetDataFromSap5 (用于调用SAP接口的函数，返回Promise)
	// - sapMoveCodeList (移动代码列表，数组，例如 ['601', '643', '653'])

	// 1. 初始化合并表
	let table = null; // 将存储合并后的数据（对象数组）

	// 2. 循环遍历sapMoveCodeList，获取并合并每个移动类型的数据
	for (let i = 0; i < sapMoveCodeList.length; i++) {
		const code = sapMoveCodeList[i]; // 移动代码，例如 '601'
		const param = `${metCodeParamString}🈹Q902🈹${startDate}🈹${endDate}🈹${code}🈹${kw}`;

		let TYPE;
		try {
			// 调用SAP接口获取数据
			TYPE = await myAxios.getSap("SAP过账记录(多无物料)", param, "9911", "QD");
		} catch (error) {
			console.error(`调用SAP接口获取数据失败 (code: ${code}):`, error);
			continue; // 跳过此次循环，继续下一个移动代码
		}

		// 提取DataTable (假设TYPE.TableSet.Tables[0]是对象数组)
		const currentTable = TYPE.TableSet['MYTAB'];
		if (!currentTable || !Array.isArray(currentTable)) {
			console.warn(`从SAP接口获取的数据无效或不是数组 (code: ${code})`);
			continue;
		}

		if (table === null) {
			table = currentTable; // 第一次获取数据，直接赋值
		} else {
			// 合并数据: 简单地将两个数组合并 (模拟DataTable.Merge)
			table = [...table, ...currentTable];
		}
	}

	// 3. 检查是否成功获取到数据
	if (table === null || !Array.isArray(table) || table.length === 0) {
		console.warn("未获取到任何有效的SAP过账记录数据");
		return [];
	}

	// 4. 过滤掉AUFNR以'9'开头的行
	// 注意：在循环中删除数组元素时，需要倒序循环或使用filter，以避免索引问题
	let i = table.length - 1; // 倒序循环，从最后一行开始
	while (i >= 0) {
		const aufnr = table[i].AUFNR; // 订单号
		if (aufnr && aufnr.toString().startsWith('9')) {
			table.splice(i, 1); // 删除该行
		}
		i--;
	}

	// 或者使用filter方法（更简洁，但会创建新数组）：
	// table = table.filter(row => !row.AUFNR || !row.AUFNR.toString().startsWith('9'));

	// 5. 返回最终结果
	return table;
};
export {
	GetAvgMonth,
	GetSapFHL,
};